package thread;

/**
 * @description: 同步代码块的演示
 *
 * synchronized(同步监视器) {
 *     操作共享数据的代码
 * }
 * 说明：同步监视器，就是一把"锁"，任何一个类的对象，都可以充当锁，当有一个要求，多个线程必须共用一把锁
 *
 * @author: apple
 * @date:  2021/11/27 9:37 下午
 * @version 1.0
 **/
public class SynchronizedBlock {


    public static void main(String[] args) {
        StationWindow data = new StationWindow();
        Thread t1 = new Thread(data , "1号窗口");
        Thread t2 = new Thread(data , "2号窗口");
        Thread t3 = new Thread(data , "3号窗口");

        t1.start();
        t2.start();
        t3.start();

    }
}

class StationWindow implements Runnable {

    private int ticket = 100;

    Object lock = new Object();

    @Override
    public void run() {
        while (true) {

            // 虽然解决了线程同步问题，但是执行的时候只能是一个线程，相当于还是单线程！
            // synchronized(this) { 实现方式可以写this，同步监视器的对象必须是唯一的
            // }
            // synchronized(类名.class) { 继承方式必须这样写，同步监视器的对象必须是唯一的
            // }
            synchronized (this) {

                if (ticket > 0) {
                    System.out.println(Thread.currentThread().getName() + "票号：" + ticket);
                    ticket--;
                } else {
                    break;
                }
            }
        }
    }
}
